package com.tarry.thread;

import java.util.concurrent.TimeUnit;

/**
 * 线程中断
 */
public class ThreadInterruptExample {

    private static int i;

    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(() -> {
            while (!Thread.currentThread().isInterrupted()) { //默认情况下 isInterrupted返回false、通过thread.interrupt变成了true
                i++;
            }
            System.out.println("thread1-num:" + i);
        }, "interruptDemo");
        thread.start();
        TimeUnit.SECONDS.sleep(1);
        thread.interrupt(); //加和不加的效果，不加该代码线程死循环，通过thread.interrupt变成了true

        Thread thread2 = new Thread(() -> {
            while (!Thread.currentThread().isInterrupted()) {
                try {
                    TimeUnit.SECONDS.sleep(2);
                } catch (InterruptedException e) {
                    // 阻塞期间，必须要能够响应被其他线程发起中断请求之后的一个响应，而这个响应是通过InterruptedException来体现的。
                    // 1. 直接捕获异常不做任何处理
                    // 2. 将异常往外抛出
                    // 3. 停止当前线程，并打印异常信息
                    e.printStackTrace();
                    // 再次中断， 如缺少次代码，程序抛出java.lang.InterruptedException: sleep interrupted 异常，然后挂起，线程的中断状态复位，如果需要中断，再次执行中断指令
                    Thread.currentThread().interrupt(); //再次中断，程序执行完成
                }
            }
            System.out.println("thread2-num:" + i);
        }, "interruptDemo2");

        thread2.start();
        TimeUnit.SECONDS.sleep(1);
        thread2.interrupt();

    }

}
